import { average, divide, factorial, multiply, subtract, sum } from "./math";

console.log(factorial(5));// 5*4*3*2*1 = 120
console.log(subtract(10, 5, 2)); // 100-10-5-2 = 83
console.log(average(10, 5, 2, 3)); // (10+5+2+3)/4 = 5
console.log(sum(10, 5, 2, 3)); // 10+5+2+3 = 20
console.log(multiply(10, 5, 2, 3));// 10*5*2*3 = 300
console.log(divide(10, 5, 2, 20)); // 1/10/5/2/20 = 1/2000

enum UserType {
    COMMON = "common",
    ADMIN = "admin"
}
interface User {
    id : number,
    name : string,
    type : UserType
    type_txt ?: string,
}
let arr:User[]  = [
    {id : 1, name : "John", type: UserType.COMMON},
    {id : 2, name : "Jane", type: UserType.ADMIN},
    {id : 3, name : "Jim", type: UserType.ADMIN},
];
//什么时候应该使用 for 循环？
// 需要精确控制循环次数和索引： 例如，当你需要每隔特定步长迭代一次数组时。
// 性能至关重要的场景： 在某些极端情况下，for 循环的性能可能略优于其他迭代方式（但通常差异很小，可以忽略不计）。
// 中断循环： 需要使用break 或者 continue 中断循环的场景。forEach无法使用break 或者 continue 中断循环。
let arrFor : User[] = [];
for ( let i = 0; i < arr.length; i++ ) {
    console.log(arr[i]);
    if ( arr[i].type === UserType.ADMIN ) {
        arrFor.push(arr[i]);
    }
}
console.log(arrFor);

// 对象需要定义为any类型，虽然不报错但是会报语法警告 不影响运行，
let obj :any = { name : "John", age : 30, city : "New York" };
//for...in 循环用于遍历对象的可枚举属性，不适合用于遍历数组
for (const key in obj) {
    console.log(key, obj[key]);
}

// for...of 循环用于遍历数组的每个元素，适合用于遍历数组。
for (let item of arr) {
    console.log("for of", item);
}

// forEach：遍历数组的每个元素，执行指定的回调函数。
arr.forEach((item, index) => {
    console.log("forEach" , item, index);
});

// every：遍历数组的每个元素，如果所有元素都满足指定的回调函数的条件，则返回true，否则返回false。
let arrEvery = arr.every(item => {
    return item.type === 'common';
});
console.log("every :",arrEvery);

// some：遍历数组的每个元素，如果至少有一个元素满足指定的回调函数的条件，则返回true，否则返回false。
let arrSome = arr.some(item => {
    return item.type === 'admin';
});
console.log("some :",arrSome);

// filter：遍历数组的每个元素，如果满足指定的回调函数的条件，则返回该元素，否则不返回。
let arrFilter = arr.filter(item => {
    return item.type === 'common';
});
console.log("filter :",arrFilter);

// map：遍历数组的每个元素，执行指定的回调函数，返回一个新的数组，数组中的元素是回调函数的返回值。
let arrMap = arr.map(item => {
    if ( item.type === 'common' ) {
        item.type_txt = "公共";
    } else {
        item.type_txt = "管理员";
    }
    return item;
});
console.log(arrMap);

/**
 * while 循环样例
 */
let num : number = 5;
let factorialNum : number = 1;
while ( num >= 1 ) {
    factorialNum *= num;
    num--;
}
console.log("5的阶乘为：" + factorialNum);

/**
 * do...while 循环样例
 */
let total : number = 10;
do {
    console.log(total);
    total--;
} while ( total > 0 );